package com.bwjf.dzfp.common.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * <p>
 * Title:
 * </p>
 * <p>
 * Copyright: Copyright (c) 2013
 * </p>
 * <p>
 * @author:周斌
 * </p>
 * <p>
 * @version 1.0
 * </p>
 * <p>
 * 创建时间：2013-10-18 上午11:06:33
 * </p>
 * <p>
 * Description: 数字格式化
 * </p>
 */
public class NumberUtil {

	/**
	 */
	public static String double2Str(String d) {
		String str = new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP)
				.toPlainString();
		return str;
	}

	/**
	 * double转为保留小数的字符
	 * 
	 * @param d
	 *            double类型数据
	 * @param l
	 *            最大保留位数
	 */
	public static String double2Str(String d, int l) {
		String str = new BigDecimal(d).setScale(l, BigDecimal.ROUND_HALF_UP)
				.toPlainString();
		String res = "";
		for (int i = str.length() - 1; i >= 0; i--) {
			char c = str.charAt(i);
			if (c != '0') {
				if (c == '.') {
					res = str.substring(0, i);
					break;
				} else {
					res = str.substring(0, i + 1);
					break;
				}
			}
		}
		return res;
	}

	/**
	 * double转为保留小数的字符
	 * 
	 * @param d
	 *            double类型数据
	 * @param l
	 *            最大保留位数
	 */
	public static String double2Str(double d, int l) {
		String str = new BigDecimal(d).setScale(l, BigDecimal.ROUND_HALF_UP)
				.toPlainString();
		String res = "";
		for (int i = str.length() - 1; i >= 0; i--) {
			char c = str.charAt(i);
			if (c != '0') {
				if (c == '.') {
					res = str.substring(0, i);
					break;
				} else {
					res = str.substring(0, i + 1);
					break;
				}
			}
		}
		return res;
	}

	/**
	 * double类型转换
	 * 
	 * @param args
	 */
	public static String doubleFmt(String numStr) {
		String d = "";
		if (null != numStr && !"".equals(numStr)) {
			d = new BigDecimal(numStr).setScale(2, BigDecimal.ROUND_HALF_UP)
					.toPlainString();
		} else {
			d = "0";
		}

		return d;
	}

	/**
	 * 取绝对值并格式化
	 * 
	 * @param args
	 */
	public static String absAndFmt(String numStr) {
		double d = 0;
		if (numStr != null && !numStr.equals("")) {
			d = Double.parseDouble(numStr);
			if (d < 0) {
				d = -d;
			}
		}
		return double2Str(d, 2);
	}

	/**
	 * double类型转换
	 * 
	 * @param args
	 */
	public static String doubleFmt(Double numD) {
		String d = new BigDecimal(numD).setScale(2, BigDecimal.ROUND_HALF_UP)
				.toPlainString();

		return d;
	}

	/**
	 * int类型转换,当空时返回-1
	 * 
	 * @param args
	 */
	public static int toInteger(String numStr) {
		if (null != numStr && !"".equals(numStr)) {
			return Integer.valueOf(numStr);
		} else {
			return -1;
		}
	}

	public static String NumberFormat(Double number) {
		java.text.DecimalFormat myformat = new java.text.DecimalFormat("#0.00");
		if (number == null) {
			return "0.00";
		} else {
			return myformat.format(number);
		}
	}

	/****
	 * d为整数精确到2位小数 11.00
	 * 
	 * @param d
	 * @param l
	 * @return
	 */
	public static String double3Str(String d, int l) {
		String str = new BigDecimal(d).setScale(l, BigDecimal.ROUND_HALF_UP)
				.toPlainString();
		String res = "";
		for (int i = str.length() - 1; i >= 0; i--) {
			char c = str.charAt(i);
			if (c != '0') {
				if (c == '.') {
					res = str.substring(0, i);
					res = res + ".00";
					break;
				} else {
					res = str.substring(0, i + 1);
					break;
				}
			}
		}
		return res;
	}

	/**
	 * 格式化小数，保留小数到指定位数
	 * 
	 * @param d
	 *            需要格式化的数字
	 * @param decimalPlaces
	 *            最大保留几位小数
	 * @return
	 */
	public static double doubleFormat(double d, int decimalPlaces) {
		// DecimalFormat df = new DecimalFormat();
		// df.setMaximumFractionDigits(decimalPlaces);
		BigDecimal b = new BigDecimal(d);
		double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
		return f1;
	}

	/**
	 * 判断字符串数据类型是否为数字/若为数字则默认为2位小数，最高达6位小数
	 * 
	 * @return
	 */
	public static boolean isNumber(String str) {
		try {
			Double.parseDouble(str);
		} catch (NumberFormatException e) {
			return false;
		}

		return true;
	}

	/**
	 * 含税金额转不含税金额
	 * 
	 * @param hsje
	 *            含税金额
	 * @param sl
	 *            税率
	 * @param len
	 *            返回的函数金额的保留小数位数。
	 * @return String[] 0:不含税金额, 2税额
	 */
	public static String[] toBhs(String hsje, String sl, int len) {
		if (!isNumber(hsje) && !isNumber(sl)) {
			return new String[] { "", "" };
		}
		double d_hsje = Double.parseDouble(double2Str(hsje, len));
		double d_sl = Double.parseDouble(sl);
		double d_bhsje = doubleFormat(d_hsje / (1 + d_sl), len);// 计算不含税金额并保留两位

		double se = d_hsje - d_bhsje;
		return new String[] { double2Str(d_bhsje, len), double2Str(se, 2) };
	}

	public static void main(String[] args) {
		System.out.println(doubleFormat(1000.295, 2));
	}
}
